#include "LinkQueue.h"
#include <stdio.h>

struct Stack
{
    LQueue q1;
    LQueue q2;
    ElementType value;
};
typedef struct Stack stack;

void InitStack(stack *s)
{
    InitLinkQueue(&s->q1);
    InitLinkQueue(&s->q2);
}

void SPush(stack *s, ElementType element)
{
    // 入栈的时候，入到不为空的队列（我们这里刚开始两个队列都为空时默认是queue1）
    if (IsLQueueEmpty(&s->q1) == true)
    {
        QPush(&s->q2, element);
    }
    else
    {
        QPush(&s->q1, element);
    }
}

bool IsStackEmpty(stack *s)
{
    return IsLQueueEmpty(&s->q1) && IsLQueueEmpty(&s->q2);
}

ElementType* SPop(stack *s)
{
    // 出栈的时候，找到不为空的队列，出size-1个元素到另一个队列，剩下的这个元素就是出栈的元素
    if (IsStackEmpty(s) == true)
    {
        return NULL;
    }
    if (IsLQueueEmpty(&s->q1) == true)
    {
        while (GetQueueLen(&s->q2) > 1)
        {
            QPush(&s->q1, *GetLQueueFront(&s->q2));
            QPop(&s->q2);
        }
        s->value = *GetLQueueFront(&s->q2);
        QPop(&s->q2);
        return &s->value; 
    }
    else
    {
        while (GetQueueLen(&s->q1) > 1)
        {
            QPush(&s->q2, *GetLQueueFront(&s->q1));
            QPop(&s->q1);
        }
        s->value = *GetLQueueFront(&s->q1);
        QPop(&s->q1);
        return &s->value; 
    }
    
}

int main()
{
    stack s;
    InitStack(&s);
    for (int i = 0; i < 10; i++)
    {
        SPush(&s, i+1);
    }
    while (IsStackEmpty(&s) == false)
    {
        ElementType **value = SPop(&s);
        if (value == NULL)
        {
            return 0;
        }
        printf("%d ", (int)*value);
    }
    printf("\n");
    
    return 0;
}